#region Head

// 文件名称 ：UnityLogHandler.cs
// 文件描述 ：
// 创建日期 ：2021/06/30  17:26
// 创 建 者 ：crazybee0124
// 版 本 号 ：1.0

#endregion

using System;
using System.Runtime.CompilerServices;
using System.Text;

namespace LogPro
{
    internal class UnityLogHandler : ILogHandler
    {
        private static StringBuilder _messageBuilder = new StringBuilder(1024);
        private Type _debug = Type.GetType("UnityEngine.Debug,UnityEngine");
        
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Log(string message)
        {
            // public static void Log(object message)
            InvokeDebug("Log", message);
        }

        public void LogWatch(string name, string value)
        {
            _messageBuilder.Clear();
            // ReSharper disable once StringLiteralTypo
            _messageBuilder.AppendFormat("{0} : {1}\nCPAPI:", name, value);
            _messageBuilder.Append("{\"cmd\":\"Watch\" \"name\":\"");
            _messageBuilder.AppendFormat("{0}\"", name);
            _messageBuilder.Append("}");
            InvokeDebug("Log", _messageBuilder.ToString());
        }

        public void LogWarning(string message)
        {
            // public static void LogWarning(object message)
            InvokeDebug("LogWarning", message);
        }

        public void LogError(string message)
        {
            // public static void LogError(object message)
            InvokeDebug("LogError", message);
        }

        public void Dispose()
        {
            _debug = null;
            _messageBuilder.Clear();
            _messageBuilder = null;
        }
        
        private void InvokeDebug(string funName, string message)
        {
            var fun = _debug.GetMethod(funName, new[] {typeof(object)});
            fun?.Invoke(null, new object[] {message});
        }
    }
}